package io.bd;

import io.ItemBusqueda;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Mariano Zapata
 */
public class Buscador {

    private Connection conexion;

    public Buscador(Connection conexion) {
        this.conexion= conexion;
    }

    public List<ItemBusqueda> buscarCarpeta(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT id, padre, nombre FROM Directorio WHERE LOWER(nombre) LIKE '" + palabraClave.toLowerCase() +
                    "%' ORDER BY nombre";
        else
            renglon= "SELECT id, padre, nombre FROM Directorio WHERE LOWER(nombre) LIKE '%" + palabraClave.toLowerCase() +
                    "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarArchivo(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT id, nombre, carpeta FROM Archivo WHERE LOWER(nombre) LIKE '" + palabraClave.toLowerCase() +
                    "%' ORDER BY nombre";
        else
            renglon= "SELECT id, nombre, carpeta FROM Archivo WHERE LOWER(nombre) LIKE '%" + palabraClave.toLowerCase() +
                    "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(3), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(2));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarClienteApellido(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT id, carpeta, apellido, nombre, dni FROM Cliente WHERE LOWER(apellido) LIKE '" +
                    palabraClave.toLowerCase() + "%' ORDER BY apellido, nombre";
        else
            renglon= "SELECT id, carpeta, apellido, nombre, dni FROM Cliente WHERE LOWER(apellido) LIKE '%" +
                    palabraClave.toLowerCase() + "%' ORDER BY apellido, nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            String texto= "";
            int dni= r.getInt(5);
            if (dni == -1)
                texto= r.getString(3) + ", " + r.getString(4) + " (no ha sido cargado el DNI)";
            else
                texto= r.getString(3) + ", " + r.getString(4) + " (" + r.getInt(5) + ")";
            i.setTexto(texto);
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarClienteNombre(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT id, carpeta, apellido, nombre, dni FROM Cliente WHERE LOWER(nombre) LIKE '" +
                    palabraClave.toLowerCase() + "%' ORDER BY nombre, apellido";
        else
            renglon= "SELECT id, carpeta, apellido, nombre, dni FROM Cliente WHERE LOWER(nombre) LIKE '%" +
                    palabraClave.toLowerCase() + "%' ORDER BY nombre, apellido";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            String texto= "";
            int dni= r.getInt(5);
            if (dni == -1)
                texto= r.getString(4) + ", " + r.getString(3) + " (no ha sido cargado el DNI)";
            else
                texto= r.getString(4) + ", " + r.getString(3) + " (" + r.getInt(5) + ")";
            i.setTexto(texto);
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarClienteDni(String palabraClave) throws SQLException
    {
        String renglon= "SELECT id, carpeta, apellido, nombre FROM Cliente WHERE dni= " + palabraClave +
                " ORDER BY apellido, nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            String texto= r.getString(3) + ", " + r.getString(4);
            i.setTexto(texto);
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteCaratula(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(nombre) LIKE '" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        else
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(nombre) LIKE '%" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteInstancia(String palabraClave, int nroInstancia, boolean concordanciaInicio)
            throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(instancia" + nroInstancia + ") LIKE '" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        else
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(instancia" + nroInstancia + ") LIKE '%" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteJuzgado(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(juzgado) LIKE '" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        else
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(juzgado) LIKE '%" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteSecretaria(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(secretaria) LIKE '" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        else
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(secretaria) LIKE '%" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteTipo(String palabraClave, boolean concordanciaInicio) throws SQLException
    {
        String renglon;
        if (concordanciaInicio)
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(tipo) LIKE '" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        else
            renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND " +
                    "LOWER(tipo) LIKE '%" + palabraClave.toLowerCase() + "%' ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    public List<ItemBusqueda> buscarExpedienteEstado(byte estado) throws SQLException
    {
        String renglon= "SELECT d.id, padre, nombre FROM Directorio AS d, Expediente AS e WHERE d.id= e.id AND estado= " +
                    estado + " ORDER BY nombre";
        Statement consulta= conexion.createStatement();
        List<ItemBusqueda> retorno= new ArrayList<ItemBusqueda>();
        ResultSet r= consulta.executeQuery(renglon);
        while (r.next())
        {
            List<Long> ruta= new ArrayList<Long>();
            ruta.add(r.getLong(1));
            String rutaLegible= this.rutaReversa(r.getLong(2), ruta);
            ItemBusqueda i= new ItemBusqueda(ruta);
            i.setRutaLegible(rutaLegible);
            i.setTexto(r.getString(3));
            retorno.add(i);
        }
        r.close();
        consulta.close();
        return retorno;
    }

    private String rutaReversa(long padre, List<Long> ruta) throws SQLException
    {
        Statement consulta= conexion.createStatement();
        ResultSet r;
        String rutaLegible= "";
        while (padre != -1)
        {
            String renglon= "SELECT padre, nombre FROM Directorio WHERE id= " + padre;
            r= consulta.executeQuery(renglon);
            r.next();
            ruta.add(0, padre);
            if (rutaLegible.isEmpty())
                rutaLegible= r.getString(2);
            else
                rutaLegible= r.getString(2) + "/" + rutaLegible;
            padre= r.getLong(1);
            r.close();
        }
        consulta.close();
        return rutaLegible;
    }
}
